//定义的一个类
class Student {
    //成员变量在没有初始化的时候，都有一个默认值
    //引用类型的值：null; float: 0.0f; int: 0; char: '\u0000'; boolean: false; double: 0.0;
    //局部变量在定义时需要初始化，而成员变量可以不初始化

    //封装：我们想隐藏的实现细节，不让类外看到我们的实现细节
    //在java当中，语法层次上来看，使用关键字private就可以了，被private修饰的属性，只能在当前类中使用
    //private：私有的，私人的;  public:公众的，公开的; default:什么都不写时的默认权限（default）; protected:受保护的
    //这几个访问权限不仅可以修饰方法，成员，还有类

    //default
    //String name;
    //int age;


        private String name; //普通成员变量：有多份
        private int age;
        //使用static修饰classroom这个教室就只有一份了
        //叫做类变量/静态成员变量：所有对象共用的，只有一份
        public static String classroom = "302";

//    public String name;
//    public int age;


    //构造方法：这个方法很特殊，如果我们没有写构造方法，编译器会自动帮我们生成一个不带任何参数的构造方法（如果我们写了，则编译器不会再生成）
    //这个构造方法没有返回值，方法名和类名是一样的，可以有多个（重载！）
    public Student() {
        //可以在里面进行初始化也可以不初始化
        //this.name = "yxj"; //就地初始化，但是不是每个对象都叫yxj，所以一般不初始化（在外面还需要赋值，所以就地初始化没意义）
        //this.age = 18;

        //使用this（）来调用带2个参数的构造方法
        //先调用带2个参数的构造方法，然后回来打印
        //调用构造方法this()  注意：1.这个写的只能用在构造方法当中才能这样写（在构造方法里面去调用构造方法）
        //2.这个方法只能写在构造方法内部的第一行；3.不能自己调用自己
        this("yxj",18);
        System.out.println("无参数的构造方法，会在主函数Student student1 = new Student();这里被调用");
    }
    //一个对象的产生至少有2步：1.为对象分配内存；2.调用合适的构造方法

    public Student(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("调用带2个参数的构造方法");
    }

    //idea生成构造方法（参数个数自己选择）：快捷键：alt+intsert(ins) ,ins和键盘的delete在一起
    //构造方法除了能够生成对象，还可以在构造对象的同时，帮我们进行对象的初始化【成员对象的初始化】
    public Student(String name) {
        this.name = name;
    }

    //构造方法的特性：1.名字必须和类名相同；2.没有返回值，设置成void也不行；
    //3.创建对象时由编译器自动调用，并且在对象的生命周期内只调用一次（相当于人的出生，每个人只能出生一次）
    //4.构造方法可以重载（用户根据自己的需求提供不同的参数的构造方法）
    //5.如果用户没有显示定义构造方法，编译器会生成一份默认的构造方法（无参）

    //当我们不想类里面的属性被类外部访问则可以使用读写属性
    //设置：只写属性
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int name) {
        this.age = age;
    }

    //获取：只读属性
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }

    //自动生成get和set：右键->generate->getter and setter


    public void doClass() {
        System.out.println(this.name+" 上课!"); //this代表当前对象（student1）的引用
    }

    public void print() {
        System.out.println("姓名"+this.name+" 年龄"+ age);
    }
}

//this的3种用法：1.this.属性；2.this()调用构造方法；3.this.方法
//不能形成环：例如：
//public Student() {
//this(1990,2,3);
//}

//public Student(String name,int age) {
//this();
//}



//new关键字用于创建一个对象的实例； 使用.来访问对象中的属性和方法； 同一个类可以创建多个实例
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student("孙悟空",8000);
        Student student2 = new Student("沙僧",1999);
        Student student3 = new Student("猪八戒",2000);
        Student student4 = new Student("悟净",3000);
        System.out.println("教室是："+Student.classroom);

    }

    public static void main1(String[] args) {
        Student student1 = new Student();
        student1.print();
    }
    public static void main0(String[] args) {
    Student student1 = new Student(); //通过new实例化对象,调用的是不带参数的构造方法
    //student1.name = "zhangsan"; //调用这个类的属性
        student1.setName("zhangsan1");
        System.out.println(student1.getName());
        //student1.age = 18; //调用这个类的属性
        student1.setAge(18);
        System.out.println(student1.getAge());
        student1.doClass(); //调用这个类的方法

        System.out.println("-------------");
        Student student2 = new Student("lisi",18); //调用的是带2个参数的构造方法
        student2.print();
    }
}










